home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / educate / wordy442.zip / SEARCH.C < prev    next >
C/C++ Source or Header  |  1996-06-20  |  4KB  |  171 lines

  1. /**************************************************************************/
  2. /*                                                                        */
  3. /*                             SEARCH UTILITY                             */     
  4. /*                                                                        */
  5. /*                                 M\Cooper                               */
  6. /*                                PO Box 237                              */
  7. /*                        St. David, AZ 85630-0237                        */
  8. /*                        -------------------------------                 */
  9. /*                        Email:  thegrendel@theriver.com                 */
  10. /*                                                                        */
  11. /**************************************************************************/
  12.  
  13.  
  14. #include "srch.h"
  15. //srch.h contains all include files, some prototypes, etc.
  16.  
  17. #define ARGCOUNT 2
  18. #define BAD_ARGS 2
  19. #define BUZZ 60
  20. #define DELAY1 500
  21. #define FILE_ERROR 10
  22. #define MAXFILENAMELEN 40
  23. #define FALSE 0
  24. #define TRUE 1
  25.  
  26.  
  27.  
  28. Rflag lookup2( char *, char * );
  29. int bzz( void );
  30. //Other prototypes found in srch.h
  31.  
  32. void main( int argc, char **argv )
  33. {
  34.    char searchfile [MAXFILENAMELEN];
  35.  
  36.       if( argc < ARGCOUNT )
  37.           {
  38.           puts( "\nFormat: search word [filename]" );
  39.           exit( BAD_ARGS );
  40.           }
  41.        else
  42.           if( argc == ARGCOUNT )
  43.              strcpy( searchfile, "word.lst" );
  44.           else
  45.               strcpy( searchfile, *(argv + 2) );
  46.  
  47.  
  48.       if( lookup2( *(argv + 1), searchfile ) )
  49.          printf( "\7\7\7%s found!", *(argv + 1) );
  50.       else
  51.          if( bzz() )
  52.             printf( "%s NOT found.", *(argv + 1) );
  53.         
  54.  
  55. }
  56.  
  57. /**********************************************************************/
  58.  
  59. int bzz()
  60. {
  61.       sound( BUZZ );
  62.       delay( DELAY1 );
  63.       nosound();
  64.       
  65.       return( TRUE );
  66. }
  67.  
  68. Rflag b_search( char *search_word, FILE *fp, long left, long right )
  69. {
  70.    int result;
  71.    long middle;
  72.    char discard [MAX_WLEN + 1],
  73.         working [MAX_WLEN + 1],
  74.         target [MAX_WLEN];
  75.     Rflag bflag = FAIL;
  76.     
  77.       strcpy( working, search_word );
  78.       strcat( working, "\n" );   //Because fgets() reads CR's
  79.  
  80.         while( right - left > MAX_SPAN )
  81.             {
  82.             middle = ( left + right ) / 2;
  83.             fseek( fp, middle, SEEK_SET );
  84.             fgets( discard, MAX_WLEN + 1, fp ); //Throw away partial(?) string.
  85.             fgets( target, MAX_WLEN, fp );
  86.  
  87.             result = strcmp( working, target );
  88.  
  89.          if( !result )
  90.             { bflag = SUCCESS; break; }
  91.  
  92.          if( result < 0 )
  93.             right = middle;
  94.          
  95.          else
  96.             if( result > 0 )
  97.                left = middle;
  98.          
  99.             else
  100.                {
  101.                puts( "Error in strcmp() in BINARY SEARCH !" );
  102.                     exit( COMPARISON_ERROR ); //Error in strcmp() !
  103.                     }
  104.             }
  105.          
  106.       if( !bflag )
  107.          bflag = l_search( search_word, fp );
  108.  
  109.       return( bflag );
  110.  
  111. }
  112.  
  113.  
  114. Rflag l_search( char *search_word, FILE *fp )
  115. {                                          
  116.     long backstep;
  117.     int test,
  118.          i;
  119.     char target [MAX_WLEN],
  120.           work [MAX_WLEN + 1],
  121.           CR_str [] = "\n";
  122.     Rflag flag = FAIL;
  123.  
  124.  
  125.         if( ( backstep = ftell( fp ) ) > 2 * MAX_SPAN )
  126.             backstep = -1L * ( 2 * MAX_SPAN );     //Else backstep to file begin.
  127.         else
  128.             backstep = -1L * backstep;
  129.  
  130.         fseek( fp, backstep, SEEK_CUR );
  131.  
  132.         strcpy( work, search_word );  //Make working copy.
  133.         strcat( work, CR_str );       //Because fgets() reads CR's
  134.  
  135.         for( i = 0; i <= MAXTESTS; i++ )
  136.             {
  137.             if( !( fgets( target, MAX_WLEN, fp ) ) ) break; //EOF!
  138.             
  139.  
  140.             test = strcmp( work, target );
  141.             if( test < 0 && i > 0 )
  142.                 break;   //Passed possible match
  143.             if( !test )
  144.                 { flag = SUCCESS; break; }
  145.             }
  146.  
  147.         return ( flag );
  148. }
  149.  
  150. Rflag lookup2( char *tstword, char *filename )
  151. {
  152.     FILE *fptr;
  153.     long file_end; //Byte count of eof [length of file]
  154.    const long file_begin = 0L;   
  155.    Rflag rflag;
  156.  
  157.       if( NULL == ( fptr = fopen( filename, "r" ) ) )
  158.          exit( FILE_ERROR );
  159.  
  160.         file_end = filelength( fileno( fptr ) );
  161.  
  162.         rflag =  b_search( tstword, fptr, file_begin, file_end );
  163.                     //  ^^^^Preserves filepos in call!
  164.  
  165.         fclose( fptr );
  166.  
  167.       return( rflag );
  168.  
  169. }
  170.  
  171.